package me.mononin.dilechat.helper;

import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.SparseArray;

/**
 * @author  mononing on 18-3-10.
 */

public class NavHelper<T> {


    //Android API中独有的集合类型，轻量型
    private final SparseArray<Tab<T>> tabs = new SparseArray<>();

    private Tab<T> currentTab;

    private final Context context;
    private final int containerId;
    private final FragmentManager mManager;
    private final OnTabChangeListener listener;

    /**
     * 类构造方法
     * @param context
     * @param containerId
     * @param mManager
     * @param listener
     */
    public NavHelper(Context context, int containerId, FragmentManager mManager, OnTabChangeListener listener) {
        this.context = context;
        this.containerId = containerId;
        this.mManager = mManager;
        this.listener = listener;
    }

    /**
     * 提供给外界点击Tab的响应，并返回结果
     * @param menuId 参数
     * @return boolean
     */
    public boolean returnClickMenu(int menuId){
        Tab<T> mTab = tabs.get(menuId);

        if (mTab!=null){
            //执行选择操作
            doSelected(mTab);
            //返回结果
            return true;
        }

        return false;
    }


    /**
     * 添加Tab
     * @param menuId
     * @param tab
     * @return
     */
    public NavHelper<T> add(int menuId,Tab<T> tab){

        tabs.put(menuId,tab);

        return this;

    }


    private void doSelected(Tab<T> tab){

        Tab<T> oldTab = null;

        if (currentTab!=null){
            oldTab = currentTab;
            if (oldTab==tab){
                //假如点击的是我当前的Tab，重新刷新返回
                notifyTabReselect(tab);
                return;
            }
        }
        //对当前的Tab进行选中操作
        currentTab = tab;
        //执行选中操作
        onTabChanged(oldTab,currentTab);

    }

    /**
     * 执行当前Tab选中操作
     * @param oldTab
     * @param newTab
     */
    private void onTabChanged(Tab<T> oldTab,Tab<T> newTab){

        FragmentTransaction ft = mManager.beginTransaction();

        if (oldTab!=null){
            if (oldTab.mFragment!=null){
                //将旧的Fragment从界面中移除，但不从缓存空间中删除
                ft.detach(oldTab.mFragment);
            }
        }

        if (newTab!=null){
            if (newTab.mFragment==null){
                //首次添加Fragment
                Fragment fragment = Fragment.instantiate(context,newTab.clx.getName(),null);

                newTab.mFragment = fragment;

                ft.add(containerId,newTab.mFragment,newTab.clx.getName());
            }else {
                ft.attach(newTab.mFragment);
            }
        }

        ft.commit();
        //通知进行回调监听器
        notifyTabSelect(oldTab,newTab);
    }

    /**
     * 通知回调操作
     * @param oldTab
     * @param newTab
     */
    private void notifyTabSelect(Tab<T> oldTab,Tab<T> newTab){
        if (listener!=null){
            listener.onTabChange(oldTab,newTab);
        }
    }


    /**
     * 重复当前点击回调
     * @param tab
     */
    private void notifyTabReselect(Tab<T> tab){

        //TODO 同一Tab点击事件处理
    }

    /**
     * 获取当前Tab
     * @return
     */
    public Tab<T> getCurrentTab(){
        return currentTab;
    }

    /**
     * 定义需要进行实际操作的Tab类
     * @param <T> 需要进行额外操作的范型属性
     */
    public static class Tab<T>{

        public Tab(Class<?> clx, T extra) {
            this.clx = clx;
            this.extra = extra;
        }

        public Class<?> clx;

        public T extra;


        Fragment mFragment;

    }



    /**
     * 定义回调监听器接口
     */
    public interface OnTabChangeListener<T>{
        void onTabChange(Tab<T> oldTab,Tab<T> newTab);
    }
}
